На языке C++ мы создадим простую Web-страницу
на основе ASP.NET, на которой отображается
информация о гостиницах. Названия городов и
гостиниц хранятся в раскрывающихся списках.
Выбор названия города в первом
раскрывающемся списке приводит к тому, что
во втором раскрывающемся списке будут
перечислены названия гостиниц, которые
расположены в выбранном городе. Информацию
о гостиницах содержит компонент Hotel.dll,
расположенный в каталоге CaseStudy\AcmeWeb. В свою
очередь, этот каталог находится в папке к
данной главе. Для заполнения списков мы
используем привязку данных. Завершенный
Конфигурирование соединения с Web-сервером
Перед тем как писать приложение, вы, возможно, пожелаете проверить, а, может быть, есть смысл изменить настройки соединения Web-сервера. Имеются два переключателя: File share (Совместное использование файлов) и FrontPage. Если приложение полностью разрабатывается на локальном компьютере, для удобства и ускорения работы рекомендуется выбрать переключатель File share (Совместное использование файлов). Чтобы получить доступ к этому параметру настройки, в меню Tools (Сервис) выберите команду Options (Параметры). Затем выберите папку Projects (Проекты), а в ней — пункт Web Settings (Параметры Web). Наконец, в группе Preferred Access Method (Предпочтительный метод доступа) выберите нужный переключатель. Процесс конфигурации соединения иллюстрируется на рис. 10.17.
Рис. 10.17. При конфигурировании соединения Web-сервера
в группе Preferred access method нужно указать
предпочтительный метод доступа
Создание сетевого приложения с помощью C++ на основе ASP.NET
1. В Visual Studio в меню File (Файл)
выберите команду New (Создать), а затем пункт
Project (Проект).
2. В диалоговом окне New Project (Новый
проект) в качестве типа проекта (Project Туре)
укажите Visual C++ Projects (Проекты на Visual C++). В
качестве используемого шаблона (Template)
укажите Managed C++ Class Library (Библиотека классов
управляемого C++).
3. Укажите AcmeWeb в качестве имени
проекта.
4. Укажите путь к проекту С:
\OI\NetCpp\ChaplO\Demos (рис. 10.18).
5. Щелкните на ОК При этом в
каталоге С: \OI\NetCpp\ChaplO\Demos будут созданы
файлы проекта, включая файл решения Acme Web sin
6. Создайте на основе каталога C:\OI\NetCpp\ChaplO
виртуальный каталог с псевдонимом NetCpp (рис
10 3), если вы не создали его раньше
Конструирование формы
Поскольку в среде Visual Studio NET конструктор форм не поддерживает язык C++, то форму лучше спроектировать на С#, а затем полученный код (на С#) перенести на язык C++ Сначала вы могли бы создать на С# фиктивный проект с формой и сконструировать саму форму Но это все уже сделано за вас Вы можете воспользоваться файлом WebForml.aspx.h, содержащим готовый код на C++ Он находится в каталоге Cas-eStudy\AcmeWeb Добавьте его в ваш проект, который расположен в каталоге Demo s\AcmeWeb
Рис. 10.18. Создание в среде Visual Studio проекта на
основе библиотеки классов C++ (Managed C++ Class Library)
Форма содержит две надписи (Label (Надпись)),
два раскрывающихся списка (DropDownList) и одну
кнопку (Button) Свойство Text (Текст) первой
надписи имеет значения City (Город), а второй
— Hotel (Гостиница) Свойство Text (Текст)
единственной кнопки имеет значение Make
Reservation (Забронировать) Идентификатор (ID)
первого раскрывающегося списка принимает
значение listCities, второго— listHo-tels
Идентификатор (ID) кнопки имеет значение
cmdMakeReservation Данная форма представлена на рис.
10.19 Размер раскрывающихся списков, которые
показаны на рисунке, был изменен
Чтобы в новом проекте (он
расположен в каталоге Demos\AcmeWeb)
воспользоваться кодом, перенесенным на C++, (этот
код содержится в файле WebForml.aspx.h, хранящемся
в папке CaseStudy\AcmeWeb), выполните следующие
действия
1. Скопируйте файл WebForml. aspx. h из
каталога CaseStudy\AcmeWeb в каталог Demos\AcmeWeb, в
котором расположен новый проект
2. Откройте новый проект, если он
еще не открыт Для этого войдите в каталог
Demos\AcmeWeb идважды щелкните на файле Acme Web. sin
Рис. 10.19. Конструктор форм (Form Designer)
позволяет добавлять элементы управления к
форме
3. В окне поиска решения (Solution Explorer),
щелкните правой кнопкой мыши на узле Header Files
(Заголовочные файлы) (Этот узел находится в
проекте Acme Web ) Теперь из контекстного меню
выберите команду Add (Добавить) и затем Add
Existing Item (Добавить существующий элемент)
После этого дважды щелкните левой кнопкой
мыши на файле WebForml. aspx. h
4. Удалите файл Acme Web. h, который в
проекте не используется Для этого выделите
этот файл в окне поиска решения (Solution Explorer) и
нажмите клавишу Delete (Удалить) Поскольку
файл AcmeWeb h больше не требуется вообще, его
можно удалить и из каталога \Demos\AcmeWeb С этой
целью можно использовать и Проводник Windows
(Windows Explorer)
5. Отредактируйте файл AcmeWeb срр
Удалите директиву iinclude, которая включает
файл AcmeWeb h Добавьте директиву # include, чтобы
включить файл WebForml aspx.h Вскоре мы добавим в
проект еще один заголовочный файл, который
называется Global. азах. h Включите его в
текущий файл при помощи директивы #include
// Это - основной файл динамически
подключаемой библиотеки (DLL).
#include "stdafx.h"
#include "Global.asax.h"
#include "WebForml.aspx h"
Ниже приведен исходный файл WebForml. aspx. h Обратите внимание, что для извлечения объекта HotelBroker используется статическое поле Global: : hotelBroker Вскоре мы увидим, что этот объект создается методом Application_Start объекта Global (Глобальный), который определен в исходном файле Global. asax. h
//WebForml.aspx.h
namespace AcmeWeb
// пространство имен AcmeWeb
{
public _gc class WebForml :
public System::Web::UI::Page
// класс сборщика мусора WebForml:
// общедоступная Система::Сеть::Пользовательский
// интерфейс::Страница
{
protected: // защищенный
System::Web::UI::WebControls::Label *Labell;
System::Web::UI::WebControls::Label *Label2;
System::Web::UI::WebControls::DropDownList
*listCities; System::Web::UI::WebControls::DropDownList
*listHotels;
private: // частный
static HotelBroker *hotelBroker; // статический
public:
WebForml()
{
Page::Init += new System::EventHandler(
this, Page_Init);
}
private: // частный
void Page_Load(Object *sender, System::EventArgs *e)
{
if ( HsPostBack)
{
hotelBroker = Global:rhotelBroker;
ArrayList *cities = hotelBroker->GetCities();
listCities->DataSource = cities; // города
ArrayList *hotels = hotelBroker->GetHotels;
dynamic_cast<String *> // Строка
(cities->get_Item(0))); // города
BindHotels(hotels); // гостиницы
DataBind();
}
}
};